#include "bib_Heap.h"

extern struct REG_CACHE *inicioCache;
extern struct REG_CACHE *finCache;

int crearHeap(HANDLE *heap){

	char nroError[TAM_ERROR + 1];

	if((*heap = HeapCreate(HEAP_NO_SERIALIZE, TAM_HEAP, 0)) == NULL){
		sprintf(nroError, "%d", GetLastError());
		imprimirLog(ERROR, "No se pudo crear el heap", nroError);
		return EXIT_FAILURE;		
	}
	
	return EXIT_SUCCESS;
}
/*=====================================================================================*/
int destruirHeap(HANDLE heap){

	char nroError[TAM_ERROR + 1];

	if(!HeapDestroy(heap)){
		sprintf(nroError, "%d", GetLastError());
		imprimirLog(WARNING, "No se pudo destruir el heap", nroError);
		return EXIT_FAILURE;		
	}
	
	return EXIT_SUCCESS;
}
/*=====================================================================================*/
int alocarMemoria(HANDLE heap, int cant, LPVOID *ptr){

	if(!(*ptr = HeapAlloc(heap, HEAP_NO_SERIALIZE, cant))){
		imprimirLog(ERROR, "No se pudo alocar la memoria para la variable", "");
		return EXIT_FAILURE;
	}
	
	return EXIT_SUCCESS;
}
/*=====================================================================================*/
int liberarMemoria(HANDLE heap, LPVOID ptr){

	char nroError[TAM_ERROR + 1];
	
	if(!HeapFree(heap, HEAP_NO_SERIALIZE, ptr)){
		sprintf(nroError, "%d", GetLastError());
		imprimirLog(WARNING, "No se pudo liberar la memoria de la variable", nroError);
		return EXIT_FAILURE;		
	}
	
	return EXIT_SUCCESS;
}
/*=====================================================================================*/
int agregarRegCache(long sector, char *datos, HANDLE heap){

	struct REG_CACHE *ptr;

	if(alocarMemoria(heap, sizeof(REG_CACHE), &ptr))
		return EXIT_FAILURE;
		
	ptr->sector = sector;
	strcpy(ptr->contenido, datos);
	ptr->siguiente = NULL;
	
	if (!inicioCache)
		inicioCache = ptr;
	else
		finCache->siguiente = ptr;
		
	finCache = ptr;
		
	return EXIT_SUCCESS;
}
/*=====================================================================================*/
int eliminarRegCache(HANDLE heap){
	
	struct REG_CACHE *ptr;
	
	ptr = inicioCache;
	inicioCache = inicioCache->siguiente;
	
	if (!inicioCache)
		finCache = NULL;
		
	liberarMemoria(heap, ptr);
	
	return EXIT_SUCCESS;
}
/*=====================================================================================*/
ponerAlFinal(REG_CACHE *anterior, REG_CACHE *actual){

	finCache->siguiente = actual;
	finCache = actual;
	anterior->siguiente = actual->siguiente;
	actual->siguiente = NULL;
	
	return EXIT_SUCCESS;
}
/*=====================================================================================*/
int anteUltimaPosicion(char *contenidoSector){

	struct REG_CACHE *ptr = inicioCache;
	int i;

	for(i = 1; i < 9; i++)
		ptr = ptr->siguiente;
		
	strcpy(contenidoSector, ptr->contenido);

	return EXIT_SUCCESS;
}